<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="box">Map结构</div>
</body>
<script>
// JavaScript 的对象（Object），本质上是键值对的集合（Hash 结构），但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。

// let obj ={
//     name:'zs'
//     true:1,
//     function(){

//     }:123,
//     {}:123
// }
// console.log(obj); ///报错 true 函数 对象当做键名 会报错误



// 为了解决这个问题，ES6 提供了 Map 数据结构。它类似于对象，也是键值对的集合，但是“键”的范围不限于字符串，各种类型的值（包括对象）都可以当作键
let map = new Map()

let obj = {name:'zs'}
let arr = [1,2,3]
map.set(obj,1)

map.set(arr,'123')

map.set(true,'123')
map.set(function(){},'123')
map.set(1,'123')
map.set(1,'123')  //set是添加方法
console.log(map);
console.log(map.has(1));//判断有没有该成员  有 返回true
console.log(map.keys());//获取到map里面所有的键名
console.log(map.values());////获取到map里面所有的键值
console.log(map.entries());//获取到map里面所有的键值对
console.log(map.size);//长度
// Map 也是可以去重    我们可以利用map结构里面不允许出现重复键名来去重

// WeakMap
// 先，WeakMap只接受对象作为键名（null除外），不接受其他类型的值作为键名。

let wm = new WeakMap()

wm.set({},1)
console.log(wm.size);//没有size
wm.set(true,'111')//报错
wm.set(null,'111')//报错
console.log(wm);
// WeakMap 只能接受对象作为键名  其他类型会报错  他原型上没有size 属性 keys()values()entries()forEach......




</script>
</html>